#ifndef _VM_VM_H
#define _VM_VM_H

#include <header_obj.h>
#include <obj_map.h>
#include <obj_thread.h>
#include "common.h"

// 把opcode.inc内容加进来，是枚举类型
// 操作码、对栈空间的影响
#define OPCODE_SLOTS(opcode, effect) OPCODE_##opcode,
typedef enum {
#include "opcode.inc"
} OpCode;
#undef OPCODE_SLOTS

typedef enum vmResult {
    VM_RESULT_SUCCESS,
    VM_RESULT_ERROR
} VMResult;   //虚拟机执行结果
//如果执行无误,可以将字符码输出到文件缓存,避免下次重新编译

struct vm {
    uint32_t allocatedBytes;  //累计已分配的内存量
    Parser *curParser;  //当前词法分析器

    Class *stringClass;
    ObjHeader *allObjects;// 对象链表

    Class *fnClass;// 函数对象
    Class *listClass;// 列表对象
    Class *rangeClass;// 步进对象
    Class *mapClass;// map对象
    Class *threadClass;// 线程对象
    Class *nullClass;// 空对象
    Class *boolClass;// 布尔类型对象
    Class *numClass;// 数字对象
    Class *objectClass;// 祖宗对象
    Class *classOfClass;// 祖宗对象

    ObjMap *allModules;
    SymbolTable allMethodNames;    //(所有)类的方法名
    ObjThread *curThread;   //当前正在执行的线程

};

void initVM(VM *vm);

VM *newVM(void);
VMResult executeInstruction(VM *vm, register ObjThread *curThread);
#endif
